% =========================================================================
% InitParameters.m - 初始化所有系统参数和NMPC控制器
% =========================================================================
clear; clc; close all;

%% 1. 仿真与控制器参数
SimParams.Ts = 0.1;       % 系统采样时间 (s)，必须与MPC步长一致
SimParams.T_sim = 50;     % 总仿真时间 (s)

%% 2. 电池模型参数 (BattParams)
BattParams.Capacity_As = 1 * 360; % 电池总容量 (单位: 安秒 A*s)
% OCV-SOC 查找表 [SOC; OCV]
BattParams.OCV_SOC_map = [
    0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1.0;
    41.0, 41.8, 42.5, 43.2, 44.4, 45.6, 46.8, 48.0, 49.2, 50.4
];
% 更多参数... (R0, R1, C1等)

%% 3. 燃料电池模型参数 (FCParams)
FCParams.tau_fc = 0.5;    % 燃料电池功率响应时间常数 (s)
FCParams.P_fc_max = 500;  % 最大功率 (W)
FCParams.P_fc_min = 50;   % 最小工作功率 (W)
% 衰减模型系数
FCParams.C1 = 1e-12;      % 负载大小相关的衰减系数
FCParams.C2 = 5e-11;      % 功率波动相关的衰减系数

% ... (脚本的其他部分，如SimParams, BattParams, FCParams保持不变) ...

%% 4. 成本函数参数 (CostParams) - 【严格按照论文提纲4.1.1节更新】
% 这部分参数将所有优化目标统一量化为“成本”（单位：元）

% --- a) 氢气消耗成本 C_H2 相关参数 ---
% 提纲公式: C_H2 = m_H2 * p_H2
CostParams.p_H2 = 30; % 氢气的价格 (元/kg) [cite: 103]
% 氢气消耗速率模型: m_H2_rate = k_H2 * P_fc
% k_H2 是氢耗率系数 (kg/s/W)，它综合了燃料电池的效率和氢气的热值。
% 这个系数需要根据您的燃料电池型号来确定。我们先用一个典型值。
% 假设燃料电池平均效率为50%，氢气低热值LHV为120 MJ/kg (1.2e8 J/kg)
% k_H2 = 1 / (eff * LHV) = 1 / (0.5 * 1.2e8) = 1.67e-8 kg/(W*s)
CostParams.k_H2 = 1.67e-8; 

% --- b) 锂电池寿命损耗成本 C_bat_loss 相关参数 ---
 % 提纲公式: C_bat_loss = (C_bat_total / N_cycle) * |ΔSOC| [cite: 104]
CostParams.C_bat_total = 500;   % 锂电池的总重置成本 (元) [cite: 104]
CostParams.N_cycle = 1000;      % 锂电池的额定循环寿命 (次) [cite: 104]

% --- c) 燃料电池老化成本 C_fc_age 相关参数 ---
 % 提纲公式: C_fc_age = (C_fc_total / α_max) * Δα_decay [cite: 106, 107]
CostParams.C_fc_total = 2000;  % 燃料电池的总重置成本 (元) [cite: 108]
CostParams.alpha_max = 20;     % 燃料电池的最大允许衰减率 (%) [cite: 108]
                                % 注意：这里的单位要与状态量alpha_decay的单位统一

% ... (脚本的后续部分，即创建nlobj对象的代码保持不变) ...
%% 5. 创建并配置非线性MPC控制器 (nlmpc)

% --- 定义模型尺寸 ---
nx = 3; % 状态量数量 [SOC, P_fc, alpha_decay]
ny = 3; % 输出量数量 (假设所有状态都可测量/观测)
nu = 1; % 控制量数量 (beta)
nmd = 1;% 测量扰动数量 (P_load)

% --- 创建NMPC对象 ---
nlobj = nlmpc(nx, ny, nu);

% --- 指定预测模型 ---
% MPC控制器将调用 'prediction_model.m' 文件来预测未来的系统状态。
nlobj.Model.StateFcn = 'prediction_model';
% 指定状态函数也需要扰动P_load作为参数
nlobj.Model.NumberOfParameters = 1; 

% --- 设置时间步长与时域 ---
nlobj.Ts = SimParams.Ts;
nlobj.PredictionHorizon = 15; % 预测未来 15 步 (1.5s)
nlobj.ControlHorizon = 5;     % 计算未来 5 步的最优控制序列

% --- 指定自定义成本函数 ---
% MPC优化器将调用 'cost_function.m' 来计算总成本J，并以最小化J为目标。
nlobj.Optimization.CustomCostFcn = 'cost_function';
% 由于我们使用自定义成本函数，所以标准的二次代价函数权重全部设为0。
nlobj.Weights.OutputVariables = [0 0 0];
nlobj.Weights.ManipulatedVariables = 0;
nlobj.Weights.ManipulatedVariablesRate = 0;
nlobj.Model.IsContinuousTime = false;
% --- 设置约束条件 ---
% 约束是NMPC非常强大的功能，用于保证系统安全运行。
% 1. 对控制量 beta 的约束
nlobj.ManipulatedVariables.Min = 0;     % beta >= 0
nlobj.ManipulatedVariables.Max = 1;     % beta <= 1

% 2. 对状态量 x 的约束
nlobj.States(1).Min = 0.2;              % 状态1 (SOC) 的下限
nlobj.States(1).Max = 0.8;              % 状态1 (SOC) 的上限

nlobj.States(2).Min = FCParams.P_fc_min;% 状态2 (P_fc) 的下限
nlobj.States(2).Max = FCParams.P_fc_max;% 状态2 (P_fc) 的上限

nlobj.States(3).Min = 0;                % 状态3 (alpha_decay) 的下限 (不能为负)
% 在 nlobj.States(3).Min = 0; 之后添加
disp('初始化完成，NMPC控制器已创建并配置完毕。');